perm filename OSA.RSX[11,HE] blob
sn#656312 filedate 1982-04-29 generic text, type T, neo UTF8
; Copyright Xerox Corporation 1979
.TITLE OSA
.DSABL GBL
.MCALL EXIT$S,MRKT$S,ASTX$S
.CSECT GLOBAL
G=.
.=G+2.+2.
.WORD STOP
.=G+100.+100.
.WORD MOVBLK
.WORD ZERO
.WORD 0
.WORD NOOP
.WORD SETBLK
.WORD CLLSWT
.WORD SYSERR
.WORD USC
.WORD GETFIX
.WORD FIXLFT
.CSECT
DYNSIZ=6500.
STKSIZ=100.
START=G+1.+1.
BINCLK=G+135.+135.
;
;ENTRY POINT FOR ALL BCPL PROGRAMS
;
ENTRY::
MRKT$S ,#6,#1,#MKTIME ;MARK TIME = 100 MSEC.(6 TICKS)
MOV #STKSIZ,R1 ;GET 100 WORDS FOR BCPL STACK
JSR PC,GETFIX
.WORD 0
TST R1 ;DID I GET IT?
BNE ENTOK ;YES, BRANCH
JSR PC,SYSERR ;NO, HALT
.WORD 0
ENTOK:
ASL R1 ;CONVERT POINTER TO ADDRESS
ADD #2*STKSIZ,R1 ;CALCULATE TOP OF STACK
MOV R1,R0 ;R0 = STACK POINTER
;
;EXECUTE BCPL MAIN PROGRAM
;
JSR PC,@START ;EXECUTE MAIN PROGRAM
.WORD 0
;
;EXIT POINT FOR BCPL PROGRAMS - MAIN PROGRAM RETURNS HERE
;
STOP::
EXIT$S
.PAGE
;
;MARK TIME ROUTINE ENTERED EVERY 100 MSEC
;
MKTIME:
TST (SP)+ ;POP EVENT FLAG NUMBER
INC BINCLK ;UPDATE BINARY CLOCK
MRKT$S ,#6,#1,#MKTIME
BCS MKTIM1
ASTX$S ;RETURN
MKTIM1:
HALT
.PAGE
;
;SUBROUTINE MoveBlock(dest,src,count)
;
MOVBLK::
ASL R1 ;CONVERT POINTERS
ASL R2 ; TO ADDRESSES
MVBLK1:
MOV (R2)+,(R1)+
SOB R3,MVBLK1
ADD #2,@SP
RTS PC ;RETURN
;
;SUBROUTINE Zero(dest,count)
;
ZERO::
ASL R1 ;CONVERT POINTER TO ADDRESS
ZERO1:
CLR (R1)+
SOB R2,ZERO1
ADD #2,@SP
RTS PC ;RETURN
;
;SUBROUTINE Noop()
;
NOOP::
ADD #2,@SP
RTS PC ;RETURN
;
;SUBROUTINE SetBlock(dest,value,count)
;
SETBLK::
ASL R1 ;CONVERT POINTER TO ADDRESS
STBLK1:
MOV R2,(R1)+
SOB R3,STBLK1
ADD #2,@SP
RTS PC ;RETURN
;
;SUBROUTINE CallSwat()
;
CLLSWT::
HALT
;
;SUBROUTINE SysErr()
;
SYSERR::
JSR PC,CLLSWT
;
;SUBROUTINE Usc(a,b) = 1/0/-1
;
USC::
CMP R1,R2
BEQ USCEQ
BHI USCHI
MOV #-1,R1
BR USCEX
USCEQ:
CLR R1
BR USCEX
USCHI:
MOV #1,R1
USCEX:
ADD #2,@SP
RTS PC ;RETURN
.PAGE
;
;SUBROUTINE GetFixed(nWords) = pointer or 0
;
GETFIX::
MOV R1,R2 ;SAVE NWORDS
MOV SIZ,R1 ;NWORDS LEFT
CMP R1,R2 ;FEWER THAN REQUESTED?
BLO GETNO ;YES, BRANCH
MOV TOP,R1 ;NO, RETURN ADDRESS
CLC ; AS POINTER
ROR R1 ;
SUB R2,SIZ ;UPDATE SIZ
ASL R2 ;CONVERT NWORDS TO BYTES
ADD R2,TOP ;UPDATE TOP
BR GETEX
GETNO:
CLR R1 ;RETURN ZERO
GETEX:
ADD #2,@SP ;RETURN
RTS PC
;
;SUBROUTINE FixedLeft() = nWords
;
FIXLFT::
MOV SIZ,R1 ;NWORDS LEFT
ADD #2,@SP ;RETURN
RTS PC
;
SIZ: .WORD DYNSIZ ;SIZE OF UNUSED BLOCK (WORDS)
DYN:: .BLKW DYNSIZ ;MEMORY BLOCK
TOP:: .WORD DYN ;LOC OF UNUSED BLOCK (BA)
.END ENTRY